package co.gov.medellin.ssti.sub.model.dao.impl;

import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import co.gov.medellin.ssti.sub.model.dao.AtributosDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;

@Repository
public class AtributosDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		AtributosDAO {
	private static final String FIND_ATR_SUBPROGRAMA_EG_BY_SUBP_COD = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
			+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
			+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ " WHERE UPPER(TRIM(NOMBRE)) = 'GESTOR' AND SBPR_CODIGO = :codigo ";

	private static final String FIND_ATRIBUTO_BY_CODIGO_AND_VIGENCIA = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
			+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
			+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ " WHERE CODIGO = :codigo AND VIGENCIA = :vigencia ";

	private static final String findAtributosValidarLista = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA "
			+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = :SBPR_CODIGO "
			+ " AND TTVF_CODIGO_DOMINIO IS NULL AND VALIDAR_LISTA='S'";

	private static final String FIND_ATRIBUTO_BY_CODIGO = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
			+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
			+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = :codigo ";

	private static final String SELECT_MAX_COD_BEN_RESTRICCION = " SELECT MAX(CODIGO)CODIGO FROM TCS_BEN_RESTRICCION";
	private static final String VALOR_CAR_ATR = "VALOR_CAR_ATR";
	private static final String VALOR_NUM_ATR = "VALOR_NUM_ATR";
	private static final String VALOR_FEC_ATR = "VALOR_FEC_ATR";

	public Collection<AtributoVO> findAtributosSubprograma(
			Long codeSubprograma, String vigencia, int opcion) {
		List<AtributoVO> atributos = new ArrayList<AtributoVO>();
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "";
		if (opcion == 0) {
			query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
					+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = :SBPR_CODIGO AND VIGENCIA = :VIGENCIA "
					+ " ORDER BY ORDEN ";
		} else {
			query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
					+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = :SBPR_CODIGO AND VIGENCIA = :VIGENCIA "
					+ " AND REST_CODIGO IS NULL ORDER BY ORDEN ";
		}
		namedParameters.put("SBPR_CODIGO", codeSubprograma);
		namedParameters.put("VIGENCIA", vigencia);

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(query.toString(), namedParameters);
		for (Map<String, Object> row : rows) {
			AtributoVO atr = new AtributoVO();

			BigDecimal codigo = (BigDecimal) row.get("CODIGO");
			BigDecimal orden = (BigDecimal) row.get("ORDEN");
			BigDecimal longitud = (BigDecimal) row.get("LONGITUD");
			BigDecimal tipoValorFlex = (BigDecimal) row
					.get("TTVF_CODIGO_DOMINIO");
			BigDecimal restCodigo = (BigDecimal) row.get("REST_CODIGO");
			if (codigo != null) {
				atr.setCodigo(codigo.toString());
				atr.setCodatributo(codigo.toString());
			}

			atr.setTipoatributo((String) row.get("TIPO_ATRIBUTO"));
			atr.setNombre((String) row.get("NOMBRE"));
			if (restCodigo != null && !restCodigo.toString().isEmpty()) {
				atr.setRestriccion(restCodigo.toString());
			}
			if (orden != null) {
				atr.setOrden(orden.toString());
			}
			if (longitud != null) {
				atr.setLongitud(longitud.toString());
			}
			atr.setObligatorio((String) row.get("OBLIGATORIO"));
			atr.setEtiqueta((String) row.get("ETIQUETA"));
			atr.setValorsugerido((String) row.get("VALOR_SUGERIDO"));
			atr.setValLista((String) row.get("VALIDAR_LISTA"));
			atr.setVigencia((String) row.get("VIGENCIA"));
			if (tipoValorFlex != null) {
				atr.setTipovalorflex(tipoValorFlex.toString());
			}
			atr.setDescripcion((String) row.get("DESCRIPCION"));
			atr.setTipodato((String) row.get("TIPO_DATO"));

			String strdominio = (String) row.get("VALIDAR_LISTA");
			if (strdominio.equals("S")) {
				atr.setValoresflexibles(llenarLista(atr));
				// wtf?
				// String strVS = rst.getString("VALOR_SUGERIDO");
				atr.setDesvalorsugerido(getDesVFL(atr));
			}
			atributos.add(atr);
		}
		return atributos;
	}

	public AtributoVO findAtributoEGSubprograma(Long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		AtributoVO atr = null;
		namedParameters.put("codigo", codeSubprograma);
		try {
			atr = getNamedParameterJdbcTemplate().queryForObject(
					FIND_ATR_SUBPROGRAMA_EG_BY_SUBP_COD, namedParameters,
					new RowMapper<AtributoVO>() {
						public AtributoVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							AtributoVO atributoVO = new AtributoVO();
							atributoVO.setCodigo(rs.getString("CODIGO"));
							atributoVO.setCodatributo(rs.getString("CODIGO"));
							atributoVO.setValorsugerido(rs
									.getString("VALOR_SUGERIDO"));
							atributoVO.setTipovalorflex(rs
									.getString("TTVF_CODIGO_DOMINIO"));

							String strdominio = rs.getString("VALIDAR_LISTA");
							if (strdominio.equals("S")) {
								atributoVO
										.setValoresflexibles(llenarLista(atributoVO));
								atributoVO
										.setDesvalorsugerido(getDesVFL(atributoVO));
							}

							return atributoVO;
						}
					});
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return atr;
	}

	public AtributoVO findAtributoByCodigoAndVigencia(Long codigoAtributo,
			String vigencia) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		namedParameters.put("codigo", codigoAtributo);
		namedParameters.put("vigencia", vigencia);

		AtributoVO atributo = getNamedParameterJdbcTemplate().queryForObject(
				FIND_ATRIBUTO_BY_CODIGO_AND_VIGENCIA, namedParameters,
				new RowMapper<AtributoVO>() {
					public AtributoVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						AtributoVO atributoVO = new AtributoVO();
						atributoVO.setCodigo(rs.getString("CODIGO"));
						atributoVO.setCodatributo(rs.getString("CODIGO"));
						atributoVO.setTipoatributo(rs
								.getString("TIPO_ATRIBUTO"));
						atributoVO.setNombre(rs.getString("NOMBRE"));
						atributoVO.setRestriccion(rs.getString("REST_CODIGO"));
						atributoVO.setOrden(rs.getString("ORDEN"));
						atributoVO.setLongitud(rs.getString("LONGITUD"));
						atributoVO.setObligatorio(rs.getString("OBLIGATORIO"));
						atributoVO.setEtiqueta(rs.getString("ETIQUETA"));
						atributoVO.setValorsugerido(rs
								.getString("VALOR_SUGERIDO"));
						atributoVO.setValLista(rs.getString("VALIDAR_LISTA"));
						atributoVO.setVigencia(rs.getString("VIGENCIA"));
						atributoVO.setTipovalorflex(rs
								.getString("TTVF_CODIGO_DOMINIO"));
						atributoVO.setDescripcion(rs.getString("DESCRIPCION"));
						atributoVO.setTipodato(rs.getString("TIPO_DATO"));
						return atributoVO;
					}
				});
		return atributo;
	}

	public AtributoVO findAtributoByCodigo(Long codigoAtributo) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		namedParameters.put("codigo", codigoAtributo);
		final Long codigoAtr = codigoAtributo;
		AtributoVO atributo = null;
		try {
			atributo = getNamedParameterJdbcTemplate().queryForObject(
					FIND_ATRIBUTO_BY_CODIGO, namedParameters,
					new RowMapper<AtributoVO>() {
						public AtributoVO mapRow(ResultSet rs, int rowNum)
								throws SQLException {
							AtributoVO atributoVO = new AtributoVO();
							atributoVO = new AtributoVO();
							atributoVO.setCodigo(rs.getString("CODIGO"));
							atributoVO.setCodatributo(rs.getString("CODIGO"));
							atributoVO.setTipoatributo(rs
									.getString("TIPO_ATRIBUTO"));
							atributoVO.setNombre(rs.getString("NOMBRE"));
							atributoVO.setRestriccion(rs
									.getString("REST_CODIGO"));
							atributoVO.setOrden(rs.getString("ORDEN"));
							atributoVO.setLongitud(rs.getString("LONGITUD"));
							atributoVO.setObligatorio(rs
									.getString("OBLIGATORIO"));
							atributoVO.setEtiqueta(rs.getString("ETIQUETA"));
							atributoVO.setValorsugerido(rs
									.getString("VALOR_SUGERIDO"));
							atributoVO.setValLista(rs
									.getString("VALIDAR_LISTA"));
							atributoVO.setVigencia(rs.getString("VIGENCIA"));
							atributoVO.setTipovalorflex(rs
									.getString("TTVF_CODIGO_DOMINIO"));
							atributoVO.setDescripcion(rs
									.getString("DESCRIPCION"));
							atributoVO.setTipodato(rs.getString("TIPO_DATO"));

							if (codigoAtr.longValue() == 1234) {
								atributoVO = new AtributoVO();
								atributoVO.setCodigo("1234");
								atributoVO.setCodatributo("1234");
								atributoVO.setTipoatributo("B");
								atributoVO.setNombre("TERCERO");
								atributoVO.setRestriccion("");
								atributoVO.setOrden("35");
								atributoVO.setLongitud("200");
								atributoVO.setObligatorio("N");
								atributoVO.setEtiqueta("TERCERO");
								atributoVO.setValorsugerido("");
								atributoVO.setValLista("N");
								atributoVO.setVigencia("A");
								atributoVO.setTipovalorflex("");
								atributoVO.setDescripcion("");
								atributoVO.setTipodato("A");
							}
							return atributoVO;
						}
					});
		} catch (IncorrectResultSizeDataAccessException e) {
			// TODO: handle exception
		}
		return atributo;
	}

	public int findMaxCodigoRestriccion() {
		int codigo = 0;
		codigo = (Integer) getJdbcTemplate().queryForObject(
				SELECT_MAX_COD_BEN_RESTRICCION, Integer.class);
		return codigo;
	}

	public int findAtributosValidarLista(Long codeSubprograma) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		namedParameters.put("SBPR_CODIGO", codeSubprograma);

		int actualizarAtriVallista = 0;

		List<Map<String, Object>> rows = getNamedParameterJdbcTemplate()
				.queryForList(findAtributosValidarLista, namedParameters);
		for (Map<String, Object> row : rows) {
			BigDecimal codeAtri = (BigDecimal) row.get("CODIGO");
			if (codeAtri == null) {
				throw new DAOException("CODIGO ATRIBUTO NULL");
			}
			Long codeAtriL = codeAtri.longValue();
			actualizarAtriVallista = updateAtriValidarLista(codeSubprograma,
					codeAtriL);
		}
		return actualizarAtriVallista;
	}

	public int insertBeneficiarioAtri(String strValor, String strTipodato,
			Long codeAtributo, Long codeBeneficiario, int i, String[] strArrIns) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String tipoAtr = "";
		String append = "";
		if (strTipodato.equalsIgnoreCase("A")
				|| strTipodato.equalsIgnoreCase("L")) {
			tipoAtr = VALOR_CAR_ATR;
			append = " UPPER(:VALOR_ATR) ";
		} else {
			if (strTipodato.equals("N")) {
				if (!strValor.equals("")) {
					tipoAtr = VALOR_NUM_ATR;
					append = " :VALOR_ATR ";
				}
			} else {
				tipoAtr = VALOR_FEC_ATR;
				append = " TO_DATE(:VALOR_ATR,'dd/mm/rrrr'";
			}
		}
		StringBuffer query = new StringBuffer(
				"MERGE INTO TCS_BEN_BENEFICIARIO_ATRIBUTO USING DUAL "
						+ " ON (BEN_CODIGO = :BEN_CODIGO AND SAB_CODIGO = :SAB_CODIGO ) "
						+ " WHEN NOT MATCHED THEN "
						+ " INSERT (CODIGO, SAB_CODIGO, BEN_CODIGO, " + tipoAtr
						+ ", USUARIO_CREA, FECHA_CREA, TERMINAL_CREA) ");
		query.append(" VALUES(SCS_BEN_BRA.NEXTVAL, :SAB_CODIGO, :BEN_CODIGO, :tipoAtr, :USUARIO_CREA, TO_DATE(sysdate,'dd/mm/RRRR'), :TERMINAL_CREA ) ");
		query.append(" WHEN MATCHED THEN UPDATE ");
		query.append(" SET "
				+ tipoAtr
				+ " = "
				+ append
				+ ", USUARIO_MODIFICA = :USUARIO_MODIFICA , FECHA_MODIFICA = TO_DATE(sysdate,'dd/mm/RRRR'), TERMINAL_MODIFICA = :TERMINAL_MODIFICA");

		// parametros merge
		namedParameters.put("BEN_CODIGO", codeBeneficiario); // ben_codigo
		namedParameters.put("SAB_CODIGO", codeAtributo);// sab_codigo
		// parametros insert
		// namedParameters.put("SAB_CODIGO", codeAtributo); // sab_codigo
		// namedParameters.put("BEN_CODIGO", codeBeneficiario);// ben_codigo
		namedParameters.put("tipoAtr", strValor);
		namedParameters.put("USUARIO_CREA", strArrIns[0]);// usuario_crea
		namedParameters.put("TERMINAL_CREA", strArrIns[1]);// terminal_crea
		// parametros update
		namedParameters.put("VALOR_ATR", strValor);
		namedParameters.put("USUARIO_MODIFICA", strArrIns[0]);// usuario_modifica
		namedParameters.put("TERMINAL_MODIFICA", strArrIns[1]);// terminal_modifica

		return getNamedParameterJdbcTemplate().update(query.toString(),
				namedParameters);

	}

	public int insertBeneficioAtri(String strValor, String strTipodato,
			Long codeAtri, Long codeBot, int i, String[] strArrIns) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String queryFecha = "SELECT TO_CHAR(FECHA_BENEFICIO+:i,'dd/mm/RRRR') fecha "
				+ " FROM tcs_ben_beneficio_otorgado WHERE codigo = :codigo ";
		namedParameters.put("i", i);
		namedParameters.put("codigo", codeBot);

		String fecha;
		String res = getNamedParameterJdbcTemplate().queryForObject(queryFecha,
				namedParameters, String.class);
		if (res != null && !res.isEmpty()) {
			fecha = res;
		} else {
			fecha = "sysdate";
		}
		// reusar map para la siguiente query.
		namedParameters.clear();

		StringBuffer query = new StringBuffer(
				"INSERT INTO TCS_BEN_BENEFICIO_ATRIBUTO (CODIGO, BOT_CODIGO, SAB_CODIGO, ");
		query.append((strTipodato.equalsIgnoreCase("A") || strTipodato
				.equalsIgnoreCase("L")) ? VALOR_CAR_ATR : (strTipodato
				.equalsIgnoreCase("N")) ? VALOR_NUM_ATR : VALOR_FEC_ATR);
		query.append(", CAMPO_F1, usuario_crea, fecha_crea, terminal_crea) ");
		query.append(" VALUES(SCS_BEN_BAT.NEXTVAL, :BOT_CODIGO, :SAB_CODIGO, ");

		if (strTipodato.equalsIgnoreCase("A")
				|| strTipodato.equalsIgnoreCase("L")) {
			query.append(" UPPER(:VALOR_ATR) ");
		} else {
			if (strTipodato.equals("N")) {
				if (!strValor.equals("")) {
					query.append(":VALOR_ATR");
				}
			} else {
				query.append("TO_DATE(:VALOR_ATR,'dd/mm/rrrr')");
			}
		}
		// CAMPO_F1, usuario_crea, fecha_crea, terminal_crea)
		query.append(", TO_DATE(:CAMPO_F1,'dd/mm/RRRR'), :usuario_crea, TO_DATE(sysdate,'dd/mm/RRRR'), :terminal_crea)");

		namedParameters.put("BOT_CODIGO", codeBot);
		namedParameters.put("SAB_CODIGO", codeAtri);
		namedParameters.put("VALOR_ATR", strValor);
		namedParameters.put("CAMPO_F1", fecha);// CAMPO_F1
		namedParameters.put("usuario_crea", strArrIns[0]);// usuario_crea
		namedParameters.put("terminal_crea", strArrIns[1]);// terminal_crea

		return getNamedParameterJdbcTemplate().update(query.toString(),
				namedParameters);
	}

	// TODO:test
	public int updateBeneficioAtri(String strValor, String strTipodato,
			Long codeAtri, Long codeBot, int i, String[] strArrIns) {

		Map<String, Object> namedParameters = new HashMap<String, Object>();
		// consulta la fecha del beneficio.
		String queryFecha = "SELECT TO_CHAR(FECHA_BENEFICIO+:i, 'dd/mm/RRRR') fecha FROM tcs_ben_beneficio_otorgado "
				+ " WHERE codigo = :codigo ";
		namedParameters.put("i", i);
		namedParameters.put("codigo", codeBot);
		String fecha = "";

		String res = getNamedParameterJdbcTemplate().queryForObject(queryFecha,
				namedParameters, String.class);
		if (res != null && !res.isEmpty()) {
			fecha = res;
		} else {
			fecha = "sysdate";
		}

		// reusar map
		namedParameters.clear();

		// construir llamada al procedimiento.
		// StringBuffer query = new StringBuffer(
		// "{call PCS_BEN_UPDATE_BENATR(:codeBot, :codeAtri, :nombre_usuario, :terminal, :VALOR_ATR, :valor, :fecha, ?");

		SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getDataSource())
				.withSchemaName("BENEFICIOS").withProcedureName(
						"PCS_BEN_UPDATE_BENATR");

		namedParameters.put("codeBOT", codeBot);// codigo beneficio otorgado
		namedParameters.put("codeSAB", codeAtri);// codigo sab
		namedParameters.put("nameUser", strArrIns[0]);// nombre usuario
		namedParameters.put("terminal", strArrIns[1]);// terminal
		if (strTipodato.equalsIgnoreCase("A")
				|| strTipodato.equalsIgnoreCase("L")) {
			namedParameters.put("dataType", VALOR_CAR_ATR);
			namedParameters.put("valor", "UPPER('" + strValor + "')");
		} else if (strTipodato.equalsIgnoreCase("N")) {
			namedParameters.put("dataType", VALOR_NUM_ATR);
			if (strValor == null || strValor.trim().isEmpty()) {
				strValor = "0";
			}
			namedParameters.put("valor", strValor.trim());
		} else {
			namedParameters.put("dataType", VALOR_FEC_ATR);
			namedParameters.put("valor", "TO_DATE('" + strValor
					+ "','dd/mm/rrrr')");
		}
		namedParameters.put("fecha", "TO_DATE('" + fecha + "','dd/mm/rrrr')");

		SqlParameterSource in = new MapSqlParameterSource(namedParameters);
		BigDecimal bigDecimal = jdbcCall.executeObject(BigDecimal.class, in);
		if (bigDecimal.intValue() == 0) {
			throw new DAOException("No se actualizo el atributo.");
		}
		return bigDecimal.intValue();
	}

	public int insertRestriccion(String[] arr) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "INSERT INTO TCS_BEN_RESTRICCION(CODIGO, DESCRIPCION, "
				+ " OPERADOR, OPERANDO1, OPERANDO2, ALERTA, VIGENCIA, CAMPO_A4, "
				+ " usuario_crea, fecha_crea, terminal_crea, "
				+ " usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(SCS_BEN_SAB.NEXTVAL,upper(:DESCRIPCION), :OPERADOR, "
				+ " :OPERANDO1, :OPERANDO2, :ALERTA, :VIGENCIA, :CAMPO_A4, "
				+ " :usuario_crea, TO_DATE(:fecha_crea,'dd/mm/rrrr'), :terminal_crea, "
				+ " :usuario_modifica, TO_DATE(:fecha_modifica,'dd/mm/rrrr'), :terminal_modifica) ";

		namedParameters.put("DESCRIPCION", arr[0]);
		namedParameters.put("OPERADOR", arr[1]);
		namedParameters.put("OPERANDO1", arr[2]);
		namedParameters.put("OPERANDO2", arr[3]);
		namedParameters.put("ALERTA", arr[4]);
		namedParameters.put("VIGENCIA", arr[5]);
		namedParameters.put("CAMPO_A4", arr[6]);
		namedParameters.put("usuario_crea", arr[7]);
		namedParameters.put("fecha_crea", arr[8]);
		namedParameters.put("terminal_crea", arr[9]);
		namedParameters.put("usuario_modifica", arr[10]);
		namedParameters.put("fecha_modifica", arr[11]);
		namedParameters.put("terminal_modifica", arr[12]);

		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public int activarAtributo(Long codeSubprograma, Long codeAtri) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET VIGENCIA = 'A' "
				+ " WHERE CODIGO = :CODIGO AND SBPR_CODIGO = :SBPR_CODIGO ";

		namedParameters.put("CODIGO", codeAtri);
		namedParameters.put("SBPR_CODIGO", codeSubprograma);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public int updateCampoRestAtri(Long codeSubprograma, Long codeAtri,
			Long codeMaxRest, String[] strArrAct) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " SET REST_CODIGO = :REST_CODIGO, OBLIGATORIO = 'S', "
				+ " usuario_modifica = :usuario_modifica,"
				+ " fecha_modifica = TO_DATE(:fecha_modifica,'dd/mm/rrrr'), "
				+ " terminal_modifica = :terminal_modifica "
				+ " WHERE CODIGO = :CODIGO AND SBPR_CODIGO = :SBPR_CODIGO ";

		namedParameters.put("REST_CODIGO", codeMaxRest);
		namedParameters.put("usuario_modifica", strArrAct[0]);
		namedParameters.put("fecha_modifica", strArrAct[1]);
		namedParameters.put("terminal_modifica", strArrAct[2]);
		namedParameters.put("CODIGO", codeAtri);
		namedParameters.put("SBPR_CODIGO", codeSubprograma);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public List<AtributoVO> findAtributosSAB(Long codeSubprog) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strSQL = "SELECT ORDEN, ETIQUETA, VIGENCIA "
				+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = :SBPR_CODIGO "
				+ " ORDER BY ORDEN";

		namedParameters.put("SBPR_CODIGO", codeSubprog);

		List<AtributoVO> atributos = getNamedParameterJdbcTemplate().query(
				strSQL, namedParameters, new RowMapper<AtributoVO>() {
					public AtributoVO mapRow(ResultSet rs, int rowNum)
							throws SQLException {
						AtributoVO atributoVO = new AtributoVO();
						atributoVO.setEtiqueta(rs.getString("ETIQUETA"));
						atributoVO.setOrden(rs.getString("ORDEN"));
						atributoVO.setVigencia(rs.getString("VIGENCIA"));
						return atributoVO;
					}
				});
		return atributos;
	}

	public String findNombreAtributoSAB(Long codeAtri) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " WHERE CODIGO = :CODIGO";
		String strName = null;

		namedParameters.put("CODIGO", codeAtri);

		strName = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
		return strName;
	}

	public String findFechaBeneficio(String strIncrement) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT TO_CHAR(SYSDATE+:i,'dd/mm/RRRR') fecha FROM dual ";
		namedParameters.put("i", strIncrement);
		String strDate = null;

		strDate = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
		return strDate;
	}

	public String findCodeAtributoGenerico(String nombreAtri) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT CODIGO FROM TCS_BEN_ATR_GENERICO WHERE NOMBRE  = :NOMBRE";
		String strCode = null;
		namedParameters.put("NOMBRE", nombreAtri);
		strCode = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, String.class);
		return strCode;
	}

	public int updateValidarLista(Long codeAtri) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " SET VALIDAR_LISTA = 'N', VALOR_SUGERIDO = '' "
				+ " WHERE CODIGO = :CODIGO";
		namedParameters.put("CODIGO", codeAtri);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	private Collection<ValorFlexibleVO> llenarLista(AtributoVO atr) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();
		String strCod = (String) atr.getTipovalorflex();
		int iCodTvfl = Integer.parseInt(strCod.trim());

		String query = "SELECT TCS_VALOR_FLEXIBLE.DESCRIPCION DESCRIPCIONVFL, TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGOVFL "
				+ " FROM paoyer.TCS_VALOR_FLEXIBLE, paoyer.TCS_TIPO_VALOR_FLEX "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = :CODIGO "
				+ " AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = :TVF_CODIGO "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA = 'S' "
				+ " ORDER BY TCS_VALOR_FLEXIBLE.DESCRIPCION";
		namedParameters.put("CODIGO", iCodTvfl);
		namedParameters.put("TVF_CODIGO", iCodTvfl);

		List<ValorFlexibleVO> valorflex = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<ValorFlexibleVO>() {
							public ValorFlexibleVO mapRow(ResultSet rs,
									int rowNum) throws SQLException {
								ValorFlexibleVO valorFlexibleVO = new ValorFlexibleVO();
								valorFlexibleVO.setDescripcionvf(rs
										.getString("DESCRIPCIONVFL"));
								Object obval = (Object) rs
										.getString("CODIGOVFL");
								if (obval != null) {
									valorFlexibleVO.setCodigovfl(rs
											.getString("CODIGOVFL"));
									valorFlexibleVO.setDescripciontvfl(rs
											.getString("DESCRIPCIONVFL"));
								} else {
									valorFlexibleVO.setCodigovfl(rs
											.getString("DESCRIPCIONVFL"));
									valorFlexibleVO.setDescripciontvfl(rs
											.getString("DESCRIPCIONVFL"));
								}

								return valorFlexibleVO;
							}
						});
		return valorflex;
	}

	private String getDesVFL(AtributoVO atr) throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strCod = (String) atr.getValorsugerido();
		String strCodvfl = "";
		if ((Object) strCod != null) {
			int iCodVfl = Integer.parseInt(strCod.trim());
			String query = "SELECT TCS_VALOR_FLEXIBLE.DESCRIPCION CODIGOVFL "
					+ " FROM paoyer.TCS_VALOR_FLEXIBLE "
					+ " WHERE TCS_VALOR_FLEXIBLE.CODIGO = :CODIGO ";
			namedParameters.put("CODIGO", iCodVfl);

			strCodvfl = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
		}
		return strCodvfl;
	}

	private int updateAtriValidarLista(Long codeSubprograma, Long codeAtri)
			throws DAOException {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ "VALIDAR_LISTA = 'N' WHERE CODIGO = :CODIGO "
				+ "AND SBPR_CODIGO = :SBPR_CODIGO ";
		namedParameters.put("CODIGO", codeAtri);
		namedParameters.put("SBPR_CODIGO", codeSubprograma);
		return getNamedParameterJdbcTemplate().update(query, namedParameters);
	}

	public AtributoVO findAtributosSubprograma(String codigoSub) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Collection<AtributoVO> findAtributoSubprogramaBOTEmpresa() {

		String query = "SELECT DISTINCT sab.TIPO_ATRIBUTO, sab.NOMBRE, sab.TIPO_DATO, "
				+ " sab.LONGITUD, sab.OBLIGATORIO "
				+ " FROM tcs_bot_empresa bot "
				+ " JOIN tcs_ben_subprograma subp ON bot.sbpr_codigo = subp.codigo "
				+ " JOIN tcs_ben_subp_atr_beneficiario sab ON sab.sbpr_codigo = subp.codigo "
				+ " ORDER BY sab.NOMBRE ASC;";

		return getNamedParameterJdbcTemplate().getJdbcOperations().query(query,
				new RowMapper<AtributoVO>() {

					@Override
					public AtributoVO mapRow(ResultSet rs, int arg1)
							throws SQLException {
						AtributoVO vo = new AtributoVO();
						vo.setTipoatributo(rs.getString("TIPO_ATRIBUTO"));
						vo.setNombre(rs.getString("NOMBRE"));
						vo.setTipodato(rs.getString("TIPO_DATO"));
						vo.setLongitud(rs.getString("LONGITUD"));
						vo.setObligatorio(rs.getString("OBLIGATORIO"));
						return vo;
					}
				});
	}

	@Override
	public String findTTVFCodeAtributoGenerico(String nombreAtri) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "SELECT TTVF_CODIGO_DOMINIO FROM TCS_BEN_ATR_GENERICO WHERE NOMBRE  = :NOMBRE";
		String strCode = null;
		namedParameters.put("NOMBRE", nombreAtri);
		System.out.println(query);
		System.out.println(namedParameters.toString());
		try {
			strCode = getNamedParameterJdbcTemplate().queryForObject(query,
					namedParameters, String.class);
		} catch (IncorrectResultSizeDataAccessException e) {
		}
		return strCode;
	}
}
